---
title: "Git's HEAD"
description: >
  Basic differences between HEAD, HEAD^, and HEAD~N
categories: posts
tags: [git, development]
---

In git literature is common to come across `HEAD`, `HEAD^`, and `HEAD~N`.
Unfortunately, they usually don't come with an explanation.

## The Tree

```text
G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A
```

The illustration above, by Jon Loeliger, depicts a commit history tree.
We can think about it as: (from `A`'s view point)

```text
A = HEAD    = HEAD^0
B = HEAD^   = HEAD^1     = HEAD~1
C = HEAD^2  = HEAD^2
D = HEAD^^  = HEAD^1^1   = HEAD~2
E = B^2     = HEAD^^2
F = B^3     = HEAD^^3
G = HEAD^^^ = HEAD^1^1^1 = HEAD~3
H = D^2     = B^^2       = HEAD^^^2 = HEAD~2^2
I = F^      = B^3^       = HEAD^^3^
J = F^2     = B^3^2      = HEAD^^3^2
```

Where `^N` stands for the Nth parent commit. That is, those commits
immediately before it, regardless of branch of origin. `^1` can be
shorten to `^`. Each parent is indexed from left to right, and relative
to it's child.

`~N` abbreviates N contiguous `^1` parents. Which means, that set of
commits forms a branch; like G-D-B-A above. We can think of it as
`HEAD`'s N previous commits.

For more info read the [specifying revision](https://schacon.github.io/git/git-rev-parse#_specifying_revisions){:rel="nofollow noreferrer noopener"}
section on git-rev-parse(1).
